import logging
import os
import shutil
import xml.etree.ElementTree as ET
from datetime import datetime

from config.config_manager import OUTPUT_DIR


def process_file(file_path):
    """
    处理文件：解析 MessageId，创建目录，移动文件，删除原文件
    """
    try:
        # 跳过隐藏文件（以 . 开头的文件）
        if os.path.basename(file_path).startswith('.'):
            logging.debug(f"跳过隐藏文件：{file_path}")
            return

        # 读取文件内容，处理编码问题
        with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
            content = f.read()

        # 解析 XML 格式的 MessageId
        message_id = extract_message_id_from_xml(content.strip())
        if not message_id:
            # 如果未找到 MessageId，记录为错误信息
            logging.warning(f"文件 {file_path} 中未找到 MessageId 或 MessageID，记录为错误信息。")
            message_id = "error"  # 将错误文件归类到 "error" 目录

        # 获取当前日期
        current_date = datetime.now().strftime("%Y-%m-%d")

        # 创建目标目录（包含当前日期和 MessageId）
        target_dir = os.path.join(OUTPUT_DIR, current_date, message_id)
        os.makedirs(target_dir, exist_ok=True)

        # 移动文件
        target_path = os.path.join(target_dir, os.path.basename(file_path))
        shutil.move(file_path, target_path)
        logging.info(f"文件 {file_path} 已移动到 {target_path}")

    except Exception as e:
        logging.error(f"处理文件 {file_path} 时出错: {e}")


def extract_message_id_from_xml(content):
    """
    从 XML 文件内容中提取 MessageId 或 MessageID，动态处理任意命名空间
    """
    try:
        # 解析 XML
        root = ET.fromstring(content)

        # 动态提取命名空间
        namespaces = {}
        for elem in root.iter():
            if elem.tag.startswith("{"):
                # 提取命名空间前缀和 URI
                ns, tag = elem.tag[1:].split("}")
                if ns not in namespaces.values():
                    namespaces[f"ns{len(namespaces)}"] = ns  # 动态分配前缀

        # 如果没有找到命名空间，使用空字符串
        if not namespaces:
            namespaces = {"ns0": ""}

        # 使用动态命名空间查找 MessageId 或 MessageID
        for ns_prefix, ns_uri in namespaces.items():
            # 尝试查找 MessageId
            message_id = root.find(f".//{{{ns_uri}}}MessageId")
            if message_id is not None:
                return message_id.text.strip()

            # 如果未找到 MessageId，尝试查找 MessageID
            message_id = root.find(f".//{{{ns_uri}}}MessageID")
            if message_id is not None:
                return message_id.text.strip()

        # 如果未找到 MessageId 或 MessageID，返回 None
        logging.warning("未找到 MessageId 或 MessageID 标签")
        return None

    except ET.ParseError as e:
        logging.warning(f"文件内容不是有效的 XML 格式: {e}")
        return None
